package Negocio;

import java.util.ArrayList;

import ClassesBasicas.Estadio;
import Repositorio.RepEstadio;
import erro.ConexaoException;
import erro.NegocioException;
import erro.RepositorioException;


/** 
 * Classe que define a Regra de Negocio para um Estadio e suas validacoes
 * 
 * @author leyla
 *
 */

public class NegocioEstadio {
	private RepEstadio rep;
	
	public NegocioEstadio(){
		rep = new RepEstadio();
	}
	
	/**
	 * Testa se o Estadio ja existe, caso exista, retorna true, 
         * caso contrario, retorna false.
	 * 
	 */
	
	public boolean existeEstadio(Estadio es) throws NegocioException {
		Estadio tmp = new Estadio();
		
		tmp = consultar(es.getNomeEstadio());
		
		if(tmp != null)
                    return true;
		else
                    return false;
	}
	
	/**
	 * Validacao dos campos de Estadio antes de salvar
	 * 
	 * @param es
	 * @throws NegocioException
	 * 
	 */
	
	public void salvar(Estadio es) throws NegocioException{
		
		//verifica se o Estadio e nulo ou vazio
		if(es == null || es.equals("")){
			throw new NegocioException("Estádio inválido ou nulo. Verifique se os campos informados estão corretos!");
		}
		
		//verifica o nome do Estadio
		if(es.getNomeEstadio() == null || es.getNomeEstadio().equals("")){
			throw new NegocioException("Nome do Estádio inválido!");
		}
		
		//verifica se o nome do Estadio e valido
		if(!ValidacoesGerais.isNomeValid(es.getNomeEstadio())){
			throw new NegocioException("Este campo não pode conter caracteres numéricos nem especiais!");
		}
		
		if(es.getCodEstadio()<0){
			throw new NegocioException("Código inválido!");
		}
		
		try {
                    rep.salvar(es);
		} catch (ConexaoException e) {
			throw new NegocioException("Verifique a conexão com o Banco de Dados!"+e.getMessage());
		}
		catch (RepositorioException e) {
			throw new NegocioException("Erro ao salvar um Estádio!"+e.getMessage());
		}
	}
	
	/**
	 * Valida e exclui um Estádio pelo código
	 * 
	 * @param codEstadio
	 * @throws NegocioException
	 * 
	 */
	
	public void excluir(int codEstadio) throws NegocioException{
		
		if(codEstadio <= 0){
			throw new NegocioException("Código Inválido!");
		}
		try {
			rep.excluir(codEstadio);
		} catch (ConexaoException e) {
			
		throw new NegocioException("Verifique a conexão com o Banco de Dados!"+e.getMessage());
		} catch (RepositorioException e) {
			throw new NegocioException("Erro ao excluir um Estádio!"+e.getMessage());
		}
	}
	
	/**
	 * Valida e exclui um Estádio pelo nome
	 * 
	 * @param nome
	 * @throws NegocioException
	 * 
	 */
	
	public void excluir(String nome) throws NegocioException{
		
		if(!ValidacoesGerais.isNomeValid(nome)){
			throw new NegocioException("Este campo não pode conter caracteres numéricos nem especiais!");
		}
		
		if(nome.equals(null) || nome.equals("")){
			throw new NegocioException("Nome inválido!");
		}
		
		try {
			rep.excluir(nome);
		} catch (ConexaoException e) {
			throw new NegocioException("Verifique a conexão com o Banco de Dados! "+e.getMessage());
		} catch (RepositorioException e) {
			throw new NegocioException("Erro ao excluir um Estádio! "+e.getMessage());
		}
	}
	
	/** 
	 * Valida e consulta um Estádio pelo código
	 * 
	 * @param codEstadio
	 * @return
	 * @throws NegocioException
	 * 
	 */
	
	public Estadio consultar(int codEstadio) throws NegocioException{
		 Estadio es = null;
		 
		 if(codEstadio <= 0){
			 throw new NegocioException("Codigo Inválido!");
		 }
		 
		 try {
			es = rep.consultar(codEstadio);
		} catch (ConexaoException e) {
			throw new NegocioException("Verifique a conexão com o Banco de Dados! "+e.getMessage());
		} catch (RepositorioException e) {
			throw new NegocioException("Erro ao consultar um Estádio! "+e.getMessage());
		}
		 return es;
	}
	
	/**
	 * Valida e consulta um Estádio pelo Nome
	 * 
	 * @param nome
	 * @return
	 * @throws NegocioException
	 * 
	 */
	
	public Estadio consultar(String nome) throws NegocioException{
		 Estadio es = null;
		 
		 if(!ValidacoesGerais.isNomeValid(nome)){
			 throw new NegocioException("Este campo não pode conter caracteres numéricos nem especiais!");
		 }
		 
		 if(nome.equals(null) ||nome.equals("")){
			 throw new NegocioException("Nome Inválido!");
		 }
		 try {
			es = rep.consultar(nome);
		} catch (ConexaoException e) {
			throw new NegocioException("Verifique a conexão com o Banco de Dados! "+e.getMessage());
		} catch (RepositorioException e) {
			throw new NegocioException("Erro ao consultar um Estádio! "+e.getMessage());
		}
		 return es;
	}
	
	/**
	 * Lista todas os Estádios, caso não encontre, retorna uma lista vazia.
	 * 
	 * @return ArrayList<Estadio>
	 * @throws NegocioException
	 * 
	 */
	
	public ArrayList<Estadio> listarEstadio() throws NegocioException{
		
		ArrayList<Estadio> lista = null;
		
		try {
			lista = (ArrayList<Estadio>) rep.listar();
		} catch (ConexaoException e) {
			throw new NegocioException("Verifique a conexão com o Banco de Dados! "+e.getMessage());
		} catch (RepositorioException e) {
			throw new NegocioException("Erro ao listar Estádios! " +e.getMessage());
		}
                return lista;
	}
}
